package com.sh.java核心技术卷1.one基本数据类型;

/**
 * @Auther: sh
 * @Version 1.0
 * @Description: 码点和代码单元
 */
public class Two {
    public static void main(String[] args) {
        String emoji = "😀"; // U+1F600

        // 1. 打印字符串长度（以 char 为单位）
        System.out.println("String length (char count): " + emoji.length()); // 2

        // 2. 打印每个 char 的值（代码单元）
        System.out.println("Code Units:");
        for (int i = 0; i < emoji.length(); i++) {
            System.out.printf("char[%d] = 0x%04X%n", i, (int) emoji.charAt(i));
        }

        // 3. 打印码点（Code Point）
        System.out.println("Code Points:");
        int codePoint = emoji.codePointAt(0);
        System.out.printf("codePointAt(0) = U+%X%n", codePoint);

        // 4. 统计字符串中有几个码点
        int codePointCount = emoji.codePointCount(0, emoji.length());
        System.out.println("Code point count: " + codePointCount);
/*
| 层级           | 理解方式                  |
| ------------ | --------------------- |
| 用户层（人眼）      | 😀 是 1 个字符            |
| 编码层（Unicode） | 😀 是 1 个码点            |
| 存储层（Java）    | 😀 占 2 个 `char`（代码单元） |



| 说法                          | 是否正确 | 原因                                        |
| -----------------------      | ----   | ----------------------------------------- |
| 一个“字符” = 一个码点           | ✅    | 在 Unicode 层面是对的                           |
| 一个“字符” = 一个 Java `char`  | ❌    | 只有 BMP 范围（U+0000 到 U+FFFF）才成立，Emoji 等超出范围 |
| 😀 是两个字符？                | ❌    | 是两个 `char`，但**还是一个字符**（code point）        |



| 角色   | 比喻     | 示例：😀                      |
| ---- | ------ | -------------------------- |
| 字符   | 一本完整的书 | 😀 是这本书                    |
| 码点   | 书的编号   | 😀 的编号是 U+1F600            |
| 代码单元 | 打印书的纸张 | Java 中用两页纸（两个 char）才能打完这本书 |

1个char != 1个字符
1个char == 1个代码单元

 */

        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("2");
        StringBuilder builder = new StringBuilder();
        builder.append("a");
        System.out.println(stringBuffer.append("2"));

    }
}

